import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
// import Router from 'vue-router'
import store from '@/store'
import { getToken } from '@/utils/auth'

axios.defaults.withCredentials = true
// 创建axios实例
const service = axios.create({
  // baseURL: 'http://baidu.com',
  // process.env.BASE_API, // api的base_url
  timeout: 60000, // 请求超时时间
  baseURL: process.env.BASE_API, // api的base_url
  withCredentials: true
})
// axios.defaults.withCredentials = true
// request拦截器
service.interceptors.request.use(config => {
  // Do something before request is sent
  if (!config.data) {
    config.data = {
      "timestamp": Date.parse(new Date())
    };
  } else {
    config.data["timestamp"] = Date.parse(new Date());
  }
  if (getToken()) {
    config.headers['token'] = getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
  }

  for (let i in config.data) {
    if (config.data[i] === '' && !(i === "permissionIds")) delete config.data[i] // 过滤空参数
  }

  if (config.method === 'get') {
    config.url = config.url + '?' + stringify(config.data)
  }
  // if (config.method === 'post') {
  //   config.data = stringify(config.data)
  // }

  config.url = config.url.replace(/\|/g, '%7C');  // 处理url的特殊字符|

  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(
  response => {
    /**
    * 下面的注释为通过response自定义code来标示请求状态，当code返回如下情况为权限有问题，登出并返回到登录页
    * 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中
    */
    // console.log(response)
    const data = response.data
    if (response.status !== 200) {
      // Message({
      //   message: res.message,
      //   type: 'error',
      //   duration: 5 * 1000
      // })
    } else {
      if (data.code === 1) {
        return data.data
      } else {
        if (data.code === 10001) {
          MessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            store.dispatch('uiLogout').then(() => {
              location.reload() // 为了重新实例化vue-router对象 避免bug
            })
          })
        } else {
          // 判断是否登录接口
          var reg = RegExp(/ui\/users\/login/)
          if (response.config.url.match(reg)) {
            return response
          }
          // --
          Message({
            message: data.message,
            type: 'error',
            duration: 2 * 1000,
            onClose: function () {
              if (data.code === 401) {
                store.dispatch('uiLogout').then(() => {
                  location.reload() // 为了重新实例化vue-router对象 避免bug
                })
              }
            }
          })
        }
        return Promise.reject('error')
      }
    }
  },
  error => {
    console.log('err' + error)// for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  })

export default service

function stringify(o) {
  let j = ''
  for (let i in o) {
    j = j + '&' + i + '=' + o[i]
  }
  return j.substr(1)
}
